package com.anrongtec.zcpt.util;

import com.art.base.util.log.LogUtil;

import android.content.Context;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;

/**
 * 定位
 * 
 * @author cxy
 *
 */
public class MyLocation {

	private Context context;

	private LocationManager lm;

	private static Double longitude = 0.00, latitude = 0.00, altitude = 0.00;

	private static MyLocation instance;

	private MyLocationListener listener;

	private MyLocation(Context c) {
		this.context = c;
		lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

	}

	public static MyLocation getInstance(Context c) {
		if (instance == null) {
			synchronized (MyLocation.class) {
				instance = new MyLocation(c);
			}
		}
		return instance;
	}

	/**
	 * 注册监听
	 */
	public void registenerLocationChangeListener() {
		/**
		 * provider:定位方式 minTime:定位时间 最少不能小于60000ms (定位需要时间)
		 * minDistance:最小距离位置更新 0代表不更新 按定位时间更新
		 * 
		 */
		// lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
		// lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0,
		// this);
		lm.requestLocationUpdates(getProvider(), 2000, 30 * 1000, getListener());
	}

	/**
	 * 获取经度
	 * 
	 * @return
	 */
	public static String getLongitude() {
		if (longitude == 0.00) {
			return null;
		}
		return String.valueOf(longitude);
	}

	/**
	 * 获取纬度0
	 * 
	 * @return
	 */
	public static String getLatitude() {
		if (latitude == 0.00) {
			return null;
		}
		return String.valueOf(latitude);
	}

	/**
	 * 获取高度
	 * 
	 * @return
	 */
	public static String getAltitude() {
		if (Double.valueOf(altitude) == 0.00) {
			return null;
		}
		return String.valueOf(altitude);
	}

	/**
	 * 获取provider
	 * 
	 * @return
	 */
	private String getProvider() {

		// 构建位置查询条件
		Criteria criteria = new Criteria();

		// 查询精度：高
		criteria.setAccuracy(Criteria.ACCURACY_FINE);

		// 是否查询海拨：否
		criteria.setAltitudeRequired(false);

		// 是否查询方位角 : 否
		criteria.setBearingRequired(false);

		// 是否允许付费：是
		criteria.setCostAllowed(true);

		// 电量要求：低
		criteria.setPowerRequirement(Criteria.POWER_LOW);

		criteria.setSpeedRequired(false); // 对速度是否关注

		// 获取最好的定位方式
		return lm.getBestProvider(criteria, true); // true 代表从打开的设备中查找

	}

	/**
	 * 获取监听
	 * 
	 * @return
	 */
	private LocationListener getListener() {
		if (listener == null) {
			listener = new MyLocationListener();
		}
		return listener;
	}

	/**
	 * 自定义位置监听
	 * 
	 * @author cxy
	 *
	 */
	class MyLocationListener implements LocationListener {

		@SuppressWarnings("unused")
		@Override
		public void onLocationChanged(Location location) {
			// 位置发生改变时调用
			longitude = location.getLongitude();// 116.363324
			latitude = location.getLatitude();// 39.986394
			altitude = location.getAltitude();
			// Toast.makeText(context, longitude + "," + latitude, 1).show();
			LogUtil.trace(Log.DEBUG, "获取坐标", longitude + ", " + latitude);
			/*
			 * //解析坐标,获取地址 //getCountryName 国家 //getAdminArea 省份 //getLocality
			 * 城市 //getSubLocality 区 //getFeatureName 街道 Geocoder geoCoder =new
			 * Geocoder(context); try { List<Address> list =
			 * geoCoder.getFromLocation(latitude, longitude, 2); if (list !=
			 * null) {
			 * 
			 * } } catch (IOException e) { // TODO Auto-generated catch block
			 * e.printStackTrace(); }
			 */
		}

		@Override
		public void onStatusChanged(String provider, int status, Bundle extras) {
			// 状态改变时调用
		}

		@Override
		public void onProviderEnabled(String provider) {
			// provider启用时调用
		}

		@Override
		public void onProviderDisabled(String provider) {
			// provider失效时调用
		}

	}

	/********** 取消监听 **********/
	public void unRegisterLocationChangeListener() {
		lm.removeUpdates(getListener());
	}

}
